考点&知识点
md5($secret.$name)===
$pass绕过
文件包含(php://filter/string.strip_tags/resource=文件)
php7文件上传时Segment Fault
,上传的临时文件不会被删除
解题过程
打开
源代码中发现
1 | <!--md5($secret.$name)===$pass --> |
这段代码暗示了$secret和$name 的拼接后的字符进行md5加密后的值等于$pass。
这里看师傅们的博客说是经典脑洞。这里的$secret
就为Cookie
hash的明文,如果要让上面这个条件成立。
$name 可以为空,然后$pass传入 $secret的hash值,这个hash值就在返回头当中。
1 | http://8c8e609f-51ac-48b8-82ea-0f19cc24e3ea.node4.buuoj.cn:81/?name=&pass=fa25e54758d5d5c1927781a6ede89f8a |
这里返回的代码中会跳转到flflflflag.php
,实际访问的时候会跳转到404.html
。这里的操作只能在burp中完成。
访问flflflflag.php
从返回的代码当中,发现include($_GET['file])
,推测是文件包含,对/etc/passwd
包含进行尝试。
验证成功,确实是文件包含,到这里有两种方式可以拿shell,一种是使用data
协议,一种是包含日志文件。可惜尝试了包含日志没有回显。无奈之下,看了师傅的博客,发现还有第三种姿势,原理就是,使用php://filter/string.strip_tags/resource=文件
让php陷入死循环,产生Segment Fault
,如果出现Segment Fault
,上传的临时文件就不会被删除,接下来就可以通过,上传一句话,然后将临时文件包含出来,getshell。这个过程需要同时完成,所有这里需要用python脚本一把梭。第三种方式这个大佬讲得更详细些
https://www.cnblogs.com/R3col/p/14929237.html
接下来直接贴脚本
1 | import requests |
这里可能会报错,多尝试几次就好了。页面会返回404,但是不影响,其实文件已经上传到临时目录下去了。
这里访问dir.php
,这里的文件名怎么知道的,扫目录扫出来的。这个文件的功能就是显示临时目录下的文件。
这里可以发现已经上传成功。接下来通过文件包含包含出来。
输出phpinfo
从返回的代码当中就可以知道,执行成功。其实flag就藏在了输出信息当中。
到这里也可以直接用蚁剑去连接,但是需要绕过disable_funcitons
,不过使用蚁剑,这还不简单吗?
总结
每一题都能学到新知识点,很不错。